昨天介紹了許多互動元件,也提到了input 和 output 參數的互動方式,那麼現在我們就來做一個簡單的互動資料表吧!我們選用了之前的訂單資料orders 來當範例。
Server的部分很簡單,就直接讀取orders.csv ,並指派到ouput$ordersTable。
orders = read.csv("input/orders.csv", stringsAsFactors=FALSE, fileEncoding="big5")
shinyServer(function(input, output) {
    
    output$ordersTable <- renderTable(orders)
    
})
UI 的部分也先簡單地顯示結果即可。這邊分配的寬度是3:9 。
shinyUI(fluidPage(
    fluidRow(
        column(3,
               h4("過濾")
        ),
        column(9,
               tableOutput('ordersTable')
        )
    )
    
))
然後我們會得到下列結果:

再來我們要新增第一個元件sliderInput ,讓使用者可以拉動多少價錢以上的資料才顯示。
shinyUI(fluidPage(
    fluidRow(
        column(3,
               h4("過濾"),
               sliderInput('price', '價格多少以上',
                           min=0, max=12000, value=300,
                           step=100, round=0)
        ),
        column(9,
               tableOutput('ordersTable')
        )
    )
    
))
而server 這邊就載入dplyr ,然後使用filter 將結果指定到output$ordersTable 即可。
orders = read.csv("input/orders.csv", stringsAsFactors=FALSE, fileEncoding="big5")
shinyServer(function(input, output) {
    
    output$ordersTable <- renderTable({
        orders %>%
            filter(input$price < PRICE)
    })
    
})
將將!一個很基本的過濾功能就完成啦!

再來,我們再追加下拉式選單來過濾PAYMENTTYPE,於是我們在UI 多加入selectInput 。
shinyUI(fluidPage(
    fluidRow(
        column(3,
               h4("過濾"),
               sliderInput('price', '價格多少以上',
                           min=0, max=12000, value=300,
                           step=100, round=0),
               selectInput('payment', '付款方式', c("信用卡",
                                                "ATM轉帳",
                                                "貨到付款",
                                                "現金",
                                                "無",
                                                "其他"))
        ),
        column(9,
               tableOutput('ordersTable')
        )
    )
    
))
然後在server 的地方更新filter 內容。
shinyServer(function(input, output) {
    
    output$ordersTable <- renderTable({
        orders %>%
            filter(input$price < PRICE, input$payment == PAYMENTTYPE)
    })
    
})
這樣就完成了第二個過濾功能!

以上就是基本的input/output 與視覺元件串接,這邊應該還算簡單吧!
Ref
day23原始碼